<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>

<!--
    一个 Vue 实例被创建时，它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。
    当这些 property 的值发生改变时，视图将会产生“响应”，即匹配更新为新的值。
-->

<div id="app">
    <p @click="msg = 'waHaHa'">{{msg}}</p>
</div>

<script type="text/javascript">
    let dataObject = {
        msg : "this content has been locked!!!"
    };

    Object.freeze(dataObject); // 被冻结以后无法被Vue追踪渲染，事件失效

    let vm = new Vue({
       el : "#app",
       data : dataObject
    });
/*

--------------------------------------------------------------------

    // 我们的数据对象
    var data = { a: 1 }

    // 该对象被加入到一个 Vue 实例中
    var vm = new Vue({
    data: data
    })

    // 获得这个实例上的 property
    // 返回源数据中对应的字段
    vm.a == data.a // => true

    // 设置 property 也会影响到原始数据
    vm.a = 2
    data.a // => 2

    // ……反之亦然
    data.a = 3
    vm.a // => 3

    当这些数据改变时，视图会进行重渲染。

    --------------------------------------------------------------------

    值得注意的是只有当实例被创建时就已经存在于 data 中的 property 才是响应式的。
    也就是说如果你添加一个新的 property，
    比如：
    vm.b = 'hi'
    那么对 b 的改动将不会触发任何视图的更新。

    ----------------------------------------------------------------------

    晚些时候需要一个 property，但是一开始它为空或不存在，那么你仅需要设置一些初始值。比如：

    data: {
      newTodoText: '',
      visitCount: 0,
      hideCompletedTodos: false,
      todos: [],
      error: null
    }
    唯一的例外是使用 Object.freeze()，这会阻止修改现有的 property，也意味着响应系统无法再追踪变化。


    除了数据 property，Vue 实例还暴露了一些有用的实例 property 与方法。它们都有前缀 $，以便与用户定义的 property 区分开来。例如：
    var data = { a: 1 }
    var vm = new Vue({
      el: '#example',
      data: data
    })

    vm.$data === data // => true
    vm.$el === document.getElementById('example') // => true

    // $watch 是一个实例方法
    vm.$watch('a', function (newValue, oldValue) {
      // 这个回调将在 `vm.a` 改变后调用
    })

*/

</script>


</body>
</html>